#include <REGX52.H>

sbit OneWire_DQ = P3^7;

/**
  * @brief		单总线初始化
  * @parm		无
  * @retval		从机响应  0表示响应，1表示无响应
  */
unsigned char OneWire_Init()
{
	unsigned char Ack = 1, i = 0;
	OneWire_DQ = 1;			//确保从高拉低
	OneWire_DQ = 0;			//主机拉低总线至少480us
	i = 227;while (--i);	//延迟490us左右
	OneWire_DQ = 1;			//释放总线
	i = 18;while (--i);		//等待45us
	Ack = OneWire_DQ;		//获取从机响应
	i = 227;while (--i);	//延迟490us左右
	return Ack;
}

/**
  * @brief		发送一位数据
  * @parm		Bit:发送的数据位
  * @retval		无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i = 0;
	OneWire_DQ = 0;			//主机拉低总线
	i = 4;while (--i);		//延迟10us左右
	OneWire_DQ = Bit;		//如果Bit为1，表示释放总线，为0则继续拉低
	i = 25;while (--i);		//延迟50us左右
	OneWire_DQ = 1;
}

/**
  * @brief		接收一位数据
  * @parm		无
  * @retval		接收的数据 范围：0/1
  */
unsigned char OneWire_ReceiveBit()
{
	unsigned char i, Bit;
	OneWire_DQ = 0;			//主机拉低总线
	i = 2;while (--i);		//等待5us左右
	OneWire_DQ = 1;			//主机释放总线
	i = 2;while (--i);		//等待5us左右
	Bit = OneWire_DQ;		//接收数据
	i = 25;while (--i);		//延迟50us左右
	return Bit;
}

/**
  * @brief		单总线发送字节数据(低位在前)
  * @parm		Byte: 要发送的数据
  * @retval		无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; ++i)
		OneWire_SendBit(Byte & (0x01 << i));
}


/**
  * @brief		单总线接收字节数据(低位在前)
  * @parm		无
  * @retval		接收的数据
  */
unsigned char OneWire_ReceiveByte()
{
	unsigned char i, Byte = 0;
	for(i = 0; i < 8; ++i)
		if(OneWire_ReceiveBit())
			Byte |= (0x01 << i);
	return Byte;
}

